package starkuz.lg.controllers.sites;

import starkuz.lg.dao.ifaces.UserDao;
import starkuz.lg.dao.ifaces.leads.CtrDao;
import starkuz.lg.dao.ifaces.sites.CtrSiteDao;
import starkuz.lg.dao.ifaces.visits.VisitCtrDao;
import starkuz.lg.dto.FormFieldsDto;
import starkuz.lg.model.User;
import starkuz.lg.model.sites.CtrSite;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import java.util.TreeSet;


@Controller
public class CtrSitesController {

    @Autowired
    private CtrSiteDao ctrSiteDao;

    public void setCtrSiteDao(CtrSiteDao ctrSiteDao) {
        this.ctrSiteDao = ctrSiteDao;
    }

    @Autowired
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Autowired
    private CtrDao ctrDao;

    public void setCtrDao(CtrDao ctrDao) {
        this.ctrDao = ctrDao;
    }

    @Autowired
    private VisitCtrDao visitCtrDao;

    public void setVisitCtrDao(VisitCtrDao visitCtrDao) {
        this.visitCtrDao = visitCtrDao;
    }

    //  вывод формы создания
    @RequestMapping(value = "/create_ctr_site.html", method = RequestMethod.GET)
    public String createCtrSite(FormFieldsDto dto, HttpServletRequest req,
                                @RequestParam(value = "id", required = false) Integer idTemplate, Map model) {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        HttpSession session = req.getSession();
        if (idTemplate != null) { //при выборе шаблона из списка
            dto.setIdTemplate(idTemplate);
            model.put("formField", dto);
            return "ctr_edit";
        } else {  //при неявном возврате на страницу редактирования
            FormFieldsDto tempCtrSiteDto = (FormFieldsDto) session.getAttribute("tempCtrSiteDto");
            if (tempCtrSiteDto != null) {
                model.put("formField", tempCtrSiteDto);
                return "ctr_edit";
            } else {
                return "error";
            }
        }
    }

    // вывод формы редактирования
    @RequestMapping(value = "/edit_ctr_site.html", method = RequestMethod.GET)
    public String editCtrSite(HttpServletRequest req, @RequestParam(value = "id",
            required = false) Integer idCtrSite, Map model) {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        CtrSite ctrSite = ctrSiteDao.findCtrSiteById(idCtrSite);
        if (ctrSite == null) {
            model.put("cause", "Данная страница отсутствует");
            return "error";
        }
        FormFieldsDto dto = convertCtrSiteToDto(ctrSite);
        model.put("formField", dto);
        model.put("ctr", dto);
        return "ctr_edit";
    }


    // считывание данных с формы редактирования и обработка
    @RequestMapping(value = "/edit_ctr_site.html", method = RequestMethod.POST)
    public String editCtrSite(@Valid FormFieldsDto dto, HttpServletRequest req, Map model) throws IOException {
        HttpSession session = req.getSession();
        String err = validateCreateCtrSite(dto);
        if (err != null) {                            //валидация
            model.put("cause", err);
            return "error";
        }
        req.getSession().setAttribute("formZip", dto);
        req.getSession().setAttribute("tempCtrSiteDto", dto);
        CtrSite ctrSite = convertDtoToCtrSite(dto);
        if (ctrSite.getId() != null) {    //если сайту присвоен айди в БД - обновляем
            syncCtrDtoWithDB(dto);
        } else {
            session.setAttribute("tempCtrSiteDto", dto);
        }
        model.put("formField", dto);
        return "templ_ctr";
    }


    //метод валидации DTO
    private String validateCreateCtrSite(FormFieldsDto dto) {
        String err = null;
        if (dto.getBlackBox() > 63) {
            err = "Блок (в % от левого края монитора, max 63)";
        }
        return err;
    }

    //метод для синхронизации содержимого DTO с базой данных
    private void syncCtrDtoWithDB(FormFieldsDto dto) {
        CtrSite ctrSite = convertDtoToCtrSite(dto);
        if (ctrSite.getId() == null) {
            ctrSiteDao.addCtrSite(ctrSite);      //если адишник не присвоен - добавляем
        } else {
            ctrSiteDao.updateCtrSite(ctrSite);   //если адишник присвоен - обновляем
        }
    }

    //сохранение только созданных сайтов в БД и переход в кабинет
    @RequestMapping(value = "/save_ctr_site.html", method = RequestMethod.GET)
    public String saveCtrSite(HttpServletRequest req, Map model) throws IOException {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        User user = (User) req.getSession().getAttribute("user");
        FormFieldsDto ctrSiteDto = (FormFieldsDto) req.getSession().getAttribute("tempCtrSiteDto");
        //задаем владельца
        req.getSession().setAttribute("tempCtrSiteDto", null);
        if (ctrSiteDto != null) {
            ctrSiteDto.setOwnerId(user.getId());
            CtrSite ctrSite = convertDtoToCtrSite(ctrSiteDto);
            ctrSiteDao.addCtrSite(ctrSite);
        }
        return "redirect:userhome_ctr.html";
    }

    @RequestMapping(value = "/delete_ctr_site.html", method = RequestMethod.GET)
    public String userhomeCtrs(HttpServletRequest req, @RequestParam(value = "id",
            required = true) Integer id, Map model) throws IOException {
        if(!isActiveUser(req)){
            return "redirect:index.html";
        }
        User user = (User) req.getSession().getAttribute("user");
        ctrSiteDao.deleteCtrSiteById(id);
        return "redirect:userhome_ctr.html";
    }

    //ХОСТИНГ ЗАКАЗОВ
    @RequestMapping(value = "/ctr-host.html", method = RequestMethod.GET)
    public String ctrHost(HttpServletRequest req, @RequestParam(value = "id",
            required = false) Integer id, Map model) throws IOException {
        CtrSite site = ctrSiteDao.findCtrSiteById(id);
        FormFieldsDto dto = convertCtrSiteToDto(site);
        model.put("formField", dto);
        addVisit(id, req);
        model.put("notshow", true);
        return "templ_ctr";
    }

    //проверка открывали ли мы сайт в этот запуск браузера, чтобы не ставить лишних визитов
    //простановка визитов в базу
    private void addVisit(Integer siteId, HttpServletRequest req) {
        Collection<Integer> visitedSites = (TreeSet<Integer>) req.getSession().getAttribute("visitedCtrSites");
        if (visitedSites == null) {
            visitedSites = new TreeSet<Integer>();
        }
        if (!visitedSites.contains(siteId)) {
            visitCtrDao.addVisit(siteId);
            visitedSites.add(siteId);
            // если сайт не посещался:добавляем в лист и пишем в сессию
            req.getSession().setAttribute("visitedCtrSites", visitedSites);
        }
    }

    // подсчет контролов
    @RequestMapping(value = "/addctr.html", method = RequestMethod.GET)
    public void addCtr(@RequestParam(value = "site_id", required = true) Integer siteId, HttpServletRequest req) {
        Collection<Integer> ctredSites = (TreeSet<Integer>) req.getSession().getAttribute("ctredSites");
        if (ctredSites == null) {
            ctredSites = new TreeSet<Integer>();
        }
        if (!ctredSites.contains(siteId)) {
            ctrDao.addCtr(siteId);
            ctredSites.add(siteId);
            // если переход не осуществлялся:добавляем в лист и пишем в сессию
            req.getSession().setAttribute("ctredSites", ctredSites);
        }
    }

    private CtrSite convertDtoToCtrSite(FormFieldsDto dto) {     //проверено  - все методы!
        CtrSite site = new CtrSite();
        if (dto.getIdSite() != null) {
            site.setId(dto.getIdSite());
        }
        site.setOwnerId(dto.getOwnerId());
        site.setIdTemplate(dto.getIdTemplate());
        site.setTitleTag(dto.getTitleTag());
        site.setKeywordTag(dto.getKeywordTag());
        site.setDescripTag(dto.getDescripTag());
        site.setMainHeader(dto.getMainHeader());
        site.setBriefDef(dto.getBriefDef());
        site.setCompanyName(dto.getCompanyName());
        site.setMySite(dto.getMySite());
        site.setDopText(dto.getDopText());
        site.setStatCode(dto.getStatCode());
        site.setGoToUrl(dto.getGoToUrl());
        site.setBtnTxt(dto.getBtnTxt());
        site.setBlackBox(dto.getBlackBox());
        site.setBgImg(dto.getBgImg());
        site.setMarketType(dto.getMarketType());
        return site;
    }

    private FormFieldsDto convertCtrSiteToDto(CtrSite site) {           //проверено  - все методы!
        FormFieldsDto dto = new FormFieldsDto();
        if (site.getId()!=null){
            dto.setIdSite(site.getId());
        }
        dto.setOwnerId(site.getOwnerId());
        dto.setIdTemplate(site.getIdTemplate());
        dto.setTitleTag(site.getTitleTag());
        dto.setKeywordTag(site.getKeywordTag());
        dto.setDescripTag(site.getDescripTag());
        dto.setMainHeader(site.getMainHeader());
        dto.setBriefDef(site.getBriefDef());
        dto.setCompanyName(site.getCompanyName());
        dto.setMySite(site.getMySite());
        dto.setDopText(site.getDopText());
        dto.setStatCode(site.getStatCode());
        dto.setGoToUrl(site.getGoToUrl());
        dto.setBtnTxt(site.getBtnTxt());
        dto.setBlackBox(site.getBlackBox());
        dto.setBgImg(site.getBgImg());
        dto.setMarketType(site.getMarketType());
        return dto;
    }

    private boolean isActiveUser(HttpServletRequest request) {
        boolean answer = false;
        HttpSession session = request.getSession();
        if (session.getAttribute("user") != null) {
            User user = (User) session.getAttribute("user");
            if (!user.getStatus().equals(User.INACTIVE)) {
                answer = true;
            }
        }
        return answer;
    }
}
